#include <iostream>
using namespace std;
// g++ -o function_template function_template.cc -std=c++11
template <typename T>
void Swap(T &a, T &b) {
  T temp = a;
  a = b;
  b = temp;
}
void test1() {
  //交换 int 变量的值
  int n1 = 100, n2 = 200;
  Swap(n1, n2);
  cout << n1 << ", " << n2 << endl;

  //交换 float 变量的值
  float f1 = 12.5, f2 = 56.93;
  Swap(f1, f2);
  cout << f1 << ", " << f2 << endl;

  //交换 char 变量的值
  char c1 = 'A', c2 = 'B';
  Swap(c1, c2);
  cout << c1 << ", " << c2 << endl;

  //交换 bool 变量的值
  bool b1 = false, b2 = true;
  Swap(b1, b2);
  cout << b1 << ", " << b2 << endl;
}

template <typename T1, typename T2>
void func1(T1 a) {
  T2 b;
}
// 显式指明的模板实参会按照从左到右的顺序与对应的模板参数匹配只有尾部（最右）的类型参数的实参可以省略，而且前提是它们可以从传递给函数的实参中推断出来
template <typename T1, typename T2>
void func2(T2 a) {
  T1 b;
}
void test2() {
  // func1<int>(10);  // 编译错误，无法推断出T2的类型
  func1<int, int>(10);
  func2<int>(10);  // 省略T2类型
  func2<int, int>(10);
}
int main() {
  test1();
  test2();
  return 0;
}